import sqlite3
# 因为使用的是SQLite
from sqlite3 import Connection


class DatabaseDriver:
    def __init__(self, username: str = "", password: str = ""):
        """
        :param username: 数据库用户名
        :param password: 数据库密码
        """
        # 设置数据库默认连接状态为未连接
        self.connection = False
        # 如果初始状态用户名和密码为空，则直接连接数据库
        if username == "" and password == "":
            # 指定连接的数据库路径
            self.conn: Connection = sqlite3.connect("db/train_check.db")
            # self.conn: Connection = sqlite3.connect("../db/book.db")
            # 设置数据库默认连接状态为连接
            self.connection: bool = True

    def close(self):
        # self.conn:数据库连接对象
        # 当我们不想用数据库的时候，需要关闭数据库
        self.conn.close()
        # 设置数据库连接状态为未连接
        self.connection = False

    def update(self, sql: str, log: bool = False):
        # 专门针对数据库有修改操作的SQL语句
        # 如果数据库连接状态为连接，则执行sql语句
        if self.connection:
            # 获取游标，建立数据库连接。它是数据库和Python代码之间的桥梁。它允许你执行SQL命令，并通过它获取查询结果
            cursor = self.conn.cursor()
            if log:
                # 如果打开日志，则输出当前的sql语句
                print("sql execute: {}".format(sql))
            # 使用数据库连接执行SQL语句，返回执行结果。
            c = cursor.execute(sql)
            if log:
                print("sql update count: {}".format(self.conn.total_changes))
            # 一定要加上commit，默认对数据库的修改，删除，添加都是自带事务的
            self.conn.commit()
            # 返回连接（conn）的总更改数
            return self.conn.total_changes
        else:
            raise Exception("数据库连接已关闭！")

    # 修改return中的bool为log
    # 一个方法，用于执行插入操作。
    # 它接受两个参数，一个是sql，表示要执行的SQL语句
    # 另一个是log，表示是否记录操作日志，默认为False
    def insert(self, sql: str, log: bool = False):
        return self.update(sql, log)

    # 查询单条结果 select * from user

    def delete(self, sql: str, log: bool = False):
        if self.connection:
            cursor = self.conn.cursor()
            if log:
                # 如果打开日志，则输出当前的sql语句
                print("sql execute: {}".format(sql))
            c = cursor.execute(sql)
            if log:
                print("sql delete count: {}".format(self.conn.total_changes))
            self.conn.commit()
            return self.conn.total_changes
        else:
            raise Exception("数据库连接已关闭！")

    def query_one(self, sql: str, log: bool = False):
        if self.connection:
            cursor = self.conn.cursor()
            # 获取其中的一条数据
            if log:
                # 如果打开日志，则输出当前的sql语句
                print("sql execute: {}".format(sql))
            c = cursor.execute(sql)
            self.conn.commit()
            # c.fetchone()是Python中使用数据库的一个常见操作，它用于从查询结果中获取一行数据
            data = c.fetchone()
            if log:
                print("sql execute result: {}".format(data))
            return data
        else:
            raise Exception("数据库连接已关闭！")

    def query_all(self, sql: str, log: bool = False):
        if self.connection:
            cursor = self.conn.cursor()
            if log:
                # 如果打开日志，则输出当前的sql语句
                print("sql execute: {}".format(sql))
            c = cursor.execute(sql)
            self.conn.commit()
            # 该函数用于从数据库查询中获取所有数据。它返回一个包含查询结果的元组
            data = c.fetchall()
            if log:
                print("sql execute result lengths: {}".format(len(data)))
                for index, d in enumerate(data):
                    print("sql execute result{}: {}".format(index + 1, d))
            return data
        else:
            raise Exception("数据库连接已关闭！")


if __name__ == "__main__":
    db = DatabaseDriver()
    print(db.query_all("select * from user"))
